package _11_整理题目._0_工具集;

import org.junit.Test;

import java.util.Arrays;
import java.util.Random;


public class _04_常用方法_常见类 {

    /**
     * Random()  java.util.Random()
     * Random random = new Random()  初始化一个随机数生成器
     * int val = random.nextInt(10)  生成一个 [0,9] 之间的随机数
     *
     */
    @Test
    public void RandomTest() {
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            System.out.println(random.nextInt(10));
        }
    }

    /**
     * Integer
     * 
     * 数值类型之间的转换：Xxx.valueOf() 转成 对应的 引用类型
     * Integer 转 String  : String.valueOf(int)
     * String  转 Integer : Integer.valueOf(string)
     * String 转 int : Integer.parseInt(string)
     * 
     * .parseXxx() 和 .valueOf() .toString() 的区别
     * .valueOf() 转成 对应的 引用类型
     * .parseInt  转成 int 基本类型
     *
     */
    @Test
    public void IntegerTest() {
        int i1 = Integer.parseInt("a2", 16);    // 162
        int i2 = Integer.parseInt("61", 8);     // 49
        
        int i3 = Integer.parseInt("44");    // 44
        
        Integer in1 = Integer.valueOf("33");
        
        String s1 = String.valueOf(in1);
        String s2 = in1.toString();

        // Integer a = new Integer(22); 返回的永远是对象
        //
        Integer a = Integer.valueOf(22);
        Integer b = Integer.valueOf(22);
        System.out.println(a == b);

    }
    
    /**
     * String、StringBuilder、StringBuffer区别
     *      String String 类是不可变类，即一旦一个 String 对象被创建以后，包含在这个对象中的字符序列是不可改变的，直至这个对象被销毁。
     *      StringBuilder 和 StringBuffer 功能基本相似，方法也差不多。不同的是，StringBuffer 是线程安全的，
     *          而 StringBuilder 则没有实现线程安全功能，所以性能略高。
     *      StringBuilder 是线程不安全的，但是单线程中性能更高
     *      使用场景：
     *          操作少量的数据使用 String。
     *          单线程操作大量数据使用 StringBuilder。
     *          多线程操作大量数据使用 StringBuffer。
     * 
     * 
     * StringBuilder sb = new StringBuilder();          新建一个 StringBuilder 对象
     *      底层使用 char[] 实现，默认长度 16
     * StringBuilder sb = new StringBuilder("hello");   新建一个 StringBuilder 对象
     *      .append()           在最后添加一个元素
     *      .deleteCharAt()     删除下标为 i 的元素
     *      .delete(i,j)        删除下标为 i 到 j 的元素
     *      .reverse()          翻转字符串
     *      .toString()         转为 String 类型
     *
     * 
     * string.split(regex, limit) : 根据规则 regex，将 string 分为 n 个元素的字符串数组，n 可选
     * . | * $   点竖星刀 等转义字符需要加 \\，java 中 \ 用 \\ 表示
     * string.split("\\.")      按照 . 分割
     * string.split("\\|")      按照 | 分割
     * string.split("\\*")      按照 * 分割
     * string.split("\\$")      按照 $ 分割
     * string.split("-")        按照 - 分割
     *
     * string.replace(".", "[.]")   用 [.] 替换 .
     * 
     * string.toCharArray()     String 转 char[]
     * new String(char[])       char[] 构造一个 String
     *
     * string.substring(int beginIndex)                 [,-1
     * string.substring(int beginIndex, int endIndex)   [)
     *
     */
    @Test
    public void StringTest() {
        String in = "12.34.56.8";
        String[] arr = in.split("\\.");
        System.out.println(Arrays.asList(arr));

        StringBuilder sb = new StringBuilder();
        sb.append(1);
        sb.append(2);

        sb.deleteCharAt(sb.length()-1);
        System.out.println(sb);

        StringBuilder stringBuilder = new StringBuilder("hello");
        stringBuilder.deleteCharAt(stringBuilder.length()-1);
        System.out.println(stringBuilder.reverse());
    }
    
    /**
     * Math 的常用方法
     * Math.log(y)       求以 e 为底的对数
     * Math.log10(y)     求以 10 为底的对数
     * Math.log(y)/Math.log(base)   求以 base 为底的对数
     * 
     * Math.ceil()      ceil 天花板，向上取整
     * Math.floor()     floor 地板，向下取整
     * Math.round()     四舍五入
     * 
     */
    @Test
    public void LogTest() {
        System.out.println(Math.log(2.72));
        System.out.println(Math.log10(11));
        
        System.out.println("Math.floor(1.8) = " + Math.floor(1.8));
        System.out.println("Math.floor(1.2) = " + Math.floor(1.2));
    
        System.out.println("Math.ceil(1.8) = " + Math.ceil(1.8));
        System.out.println("Math.ceil(1.2) = " + Math.ceil(1.2));
    
        System.out.println("Math.round(1.8) = " + Math.round(1.8));
        System.out.println("Math.round(1.2) = " + Math.round(1.2));
        
    }
    
    /**
     * 三目运算 返回最大值
     * 
     * 先计算 a b 最大值 d
     * 再计算 d c 最大值
     * d = a>b ? a : b;
     * max = d>c ? d : c;
     * 
     * 带入替换 d 即可
     * max = (a>b ? a : b) > c ? (a>b ? a : b) : c;
     *              d      > c ?        d      : c;
     */
    @Test
    public void threeTest() {
        int a=3, b=4, c=5, max=0, d=0;
        max = (a>b?a:b)>c ? (a>b?a:b) : c;
        System.out.println(max);
        
    }
}
